package com.dp.client.views.conexiones;

import java.util.Date;

import org.apache.tools.ant.types.Reference;

import com.dp.client.dto.ConexionDTO;
import com.dp.client.servicios.conexion.IServiciosConexion;
import com.dp.client.servicios.conexion.IServiciosConexionAsync;
import com.dp.client.util.Alerts;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.IntegerBox;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Button;

public class ConexionesDialog extends PopupPanel {
	private IServiciosConexionAsync servicio = GWT.create( IServiciosConexion.class );
	private FlexTable flexTable;	
	private Label lblDescripcion;
	private Label lblCapacidad;
	private Label lblDias;
	private Label lblAlmacenOrigen;
	private Label lblAlmacenDestino;
	private ListBox comboOrigen;
	private ListBox comboDestino;
	private IntegerBox integerBoxcCapacidad;
	private HorizontalPanel horizontalPanelDias;
	private TextBox textBoxDescripion;
	private Label lblHoraSalida;
	private ListBox comboHora;
	private HorizontalPanel horizontalPanel_1;
	private Button btnGuardar;
	private Button btnCerrar;
	private String dias = "LMMJVSD";
	private CheckBox [] checkDias ;
	private ConexionesPrincipal padre;
	private ConexionDTO referenciaConexion;
	void initConexiones(){
		padre.cargarCombo(comboOrigen);
		padre.cargarCombo(comboDestino);
		checkDias = new CheckBox[ 7 ];
		boolean [] diasActivos = referenciaConexion == null ? 
								 new boolean [ 7 ] : 
								 referenciaConexion.diasActivos;
		for( int i = 0 ; i < 7 ; i++ ){
			Label lbl = new Label( ""+ dias.charAt( i ) );
			horizontalPanelDias.add( lbl );
			checkDias[ i ] = new CheckBox();
			checkDias[ i ].setValue( diasActivos[ i ] );
			horizontalPanelDias.add( checkDias[ i ] );
		}
		textBoxDescripion.setText( referenciaConexion == null ? 
									"" : referenciaConexion.descripcion );
		integerBoxcCapacidad.setText( referenciaConexion == null ? "" :
									  referenciaConexion.capacidad + "" );
		
		for( int i = 0 ; i < 24 ; i++ ){
			comboHora.addItem( i+":00" , i+"" );
		}
		int hora = referenciaConexion == null ? 0 : referenciaConexion.horaSalida.getHours();
		int idOrigen = referenciaConexion == null ? 0 : padre.getidAlmacen( referenciaConexion.idOrigen );
		int idDestino = referenciaConexion == null ? 0 : padre.getidAlmacen( referenciaConexion.idDestino);
		comboOrigen.setItemSelected( idOrigen , true );
		comboDestino.setItemSelected( idDestino , true );
		comboHora.setItemSelected( hora , true );
	
	}
	public ConexionesDialog(final ConexionDTO conexion , ConexionesPrincipal padre ) {
		super(true);	
		this.padre = padre;
		referenciaConexion = conexion;
		flexTable = new FlexTable();
		setWidget(flexTable);
		flexTable.setSize("424px", "301px");
		
		lblDescripcion = new Label("Descripcion:");
		flexTable.setWidget(0, 0, lblDescripcion);
		
		textBoxDescripion = new TextBox();
		flexTable.setWidget(0, 1, textBoxDescripion);
		textBoxDescripion.setSize("232px", "auto");
		
		lblCapacidad = new Label("Capacidad:");
		flexTable.setWidget(1, 0, lblCapacidad);
		
		integerBoxcCapacidad = new IntegerBox();
		flexTable.setWidget(1, 1, integerBoxcCapacidad);
		integerBoxcCapacidad.setSize("auto", "auto");
		
		lblDias = new Label("Dias Semana:");
		flexTable.setWidget(2, 0, lblDias);
		
		horizontalPanelDias = new HorizontalPanel();
		flexTable.setWidget(2, 1, horizontalPanelDias);
		
		lblAlmacenOrigen = new Label("Almacen Origen:");
		flexTable.setWidget(3, 0, lblAlmacenOrigen);
		
		comboOrigen = new ListBox();
		flexTable.setWidget(3, 1, comboOrigen);
		
		lblAlmacenDestino = new Label("Almacen Destino:");
		flexTable.setWidget(4, 0, lblAlmacenDestino);
		
		comboDestino = new ListBox();
		flexTable.setWidget(4, 1, comboDestino);
		
		lblHoraSalida = new Label("Hora Salida:");
		flexTable.setWidget(5, 0, lblHoraSalida);
		
		comboHora = new ListBox();
		flexTable.setWidget(5, 1, comboHora);
		
		horizontalPanel_1 = new HorizontalPanel();
		horizontalPanel_1.setSpacing(5);
		flexTable.setWidget(6, 1, horizontalPanel_1);
		
		btnGuardar = new Button("Guardar");
		horizontalPanel_1.add(btnGuardar);
		btnGuardar.addClickHandler( new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				guardar();
			}
		});
		btnCerrar = new Button("Cerrar");
		btnCerrar.addClickHandler( new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				cerrar();
			}
		});
		
		horizontalPanel_1.add(btnCerrar);
		initConexiones();
	}
	void guardar(){
		if( !isValid() ){ Alerts.dialogErrorPersonalizado( "Ingrese datos correctos" ); return; }
		ConexionDTO conexion = new ConexionDTO();
		conexion.capacidad = integerBoxcCapacidad.getValue();
		conexion.descripcion = textBoxDescripion.getValue();
		conexion.diasActivos = new boolean [ 7 ];
		for( int i =0 ; i < 7; i++ ) conexion.diasActivos[ i ] = checkDias[ i ].getValue();
		Date hora = new Date();
		int horaVal = Integer.parseInt( comboHora.getValue( comboHora.getSelectedIndex() ) );
		hora.setMinutes( 0 );
		hora.setTime( 0 );
		hora.setHours( horaVal );
		conexion.horaSalida = hora;
		conexion.id = referenciaConexion == null ? 0 : referenciaConexion.id ;
		int idsel = comboDestino.getSelectedIndex();
		conexion.idDestino = padre.getidAlmacen( Integer.parseInt(comboDestino.getValue(idsel)));
		idsel = comboOrigen.getSelectedIndex();
		conexion.idOrigen = padre.getidAlmacen( Integer.parseInt( comboOrigen.getValue( idsel ) ) );
		
		servicio.guardarNuevaConexion(conexion, new AsyncCallback<Boolean>() {
			@Override
			public void onSuccess(Boolean result) {
				Alerts.dialogExitoCreacionDeObjeto( "conexion" );
				padre.refrescar();
				cerrar();
			}
			@Override
			public void onFailure(Throwable caught) {
				Alerts.dialogErrorConexion();
			}
		});
	}
	
	boolean isValid(){
		if( integerBoxcCapacidad.getValue() == null ) return false;
		if( comboOrigen.getSelectedIndex() <= 0 ) return false;
		if( comboDestino.getSelectedIndex() <= 0 ) return false;
		return true;
	}
	
	void cerrar(){
		this.hide();
	}
}

